package com.imagecollector.common.handler;

import com.alibaba.fastjson.JSON;
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;

import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;

/**
 * 自定义类型处理器
 * 将数据库中的图片地址url的json字符串与List<String>的互相转换
 */
public class JsonListTypeHandler extends BaseTypeHandler<List<String>> {
    /**
     * 将非空的 List<String> 参数设置到 PreparedStatement 中
     * 通过 JSON 序列化将 List 对象转换为字符串，以便存储到数据库中
     *
     * @param ps         PreparedStatement 对象，用于执行 SQL 语句
     * @param i          参数索引，从 1 开始
     * @param parameter  需要设置的非空 List<String> 参数
     * @param jdbcType   JDBC 类型，此处未使用
     * @throws SQLException 如果设置过程中出现 SQL 错误
     */
    @Override
    public void setNonNullParameter(PreparedStatement ps, int i, List<String> parameter, JdbcType jdbcType) throws SQLException {
        // 将 List<String> 转换为 JSON 字符串存储
        ps.setString(i, JSON.toJSONString(parameter));
    }

    /**
     * 从 ResultSet 中获取 JSON 格式的 List<String> 结果
     * 如果列值为空，则返回 null；否则，将字符串解析为 List 对象
     *
     * @param rs         ResultSet 对象，包含数据库查询结果
     * @param columnName 列名，用于获取结果集中的特定列
     * @return 解析后的 List<String> 对象，如果列值为空则返回 null
     * @throws SQLException 如果获取或解析过程中出现 SQL 错误
     */
    @Override
    public List<String> getNullableResult(ResultSet rs, String columnName) throws SQLException {
        // 从数据库获取 JSON 字符串并转换为 List<String>
        String columnValue = rs.getString(columnName);
        return columnValue == null ? null : JSON.parseArray(columnValue, String.class);
    }

    /**
     * 从 ResultSet 中通过列索引获取 JSON 格式的 List<String> 结果
     * 如果列值为空，则返回 null；否则，将字符串解析为 List 对象
     *
     * @param rs         ResultSet 对象，包含数据库查询结果
     * @param columnIndex 列索引，从 1 开始
     * @return 解析后的 List<String> 对象，如果列值为空则返回 null
     * @throws SQLException 如果获取或解析过程中出现 SQL 错误
     */
    @Override
    public List<String> getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
        String columnValue = rs.getString(columnIndex);
        return columnValue == null ? null : JSON.parseArray(columnValue, String.class);
    }

    /**
     * 从 CallableStatement 中通过列索引获取 JSON 格式的 List<String> 结果
     * 如果列值为空，则返回 null；否则，将字符串解析为 List 对象
     *
     * @param cs         CallableStatement 对象，用于执行存储过程或函数
     * @param columnIndex 列索引，从 1 开始
     * @return 解析后的 List<String> 对象，如果列值为空则返回 null
     * @throws SQLException 如果获取或解析过程中出现 SQL 错误
     */
    @Override
    public List<String> getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
        String columnValue = cs.getString(columnIndex);
        return columnValue == null ? null : JSON.parseArray(columnValue, String.class);
    }
}
